This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

AC和PA的SMC进一步分析

source("tianfengRwrappers.R")
载入需要的程辑包:dplyr

载入程辑包:‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union

载入需要的程辑包:reticulate
载入需要的程辑包:tidyr

载入程辑包:‘MySeuratWrappers’

The following objects are masked from ‘package:Seurat’:

    DimPlot, DoHeatmap, LabelClusters, RidgePlot, VlnPlot


载入程辑包:‘cowplot’

The following object is masked from ‘package:ggpubr’:

    get_legend

载入需要的程辑包:viridisLite

载入程辑包:‘reshape2’

The following object is masked from ‘package:tidyr’:

    smiths

NOTE: Either Arial Narrow or Roboto Condensed fonts are required to use these themes.
      Please use hrbrthemes::import_roboto_condensed() to install Roboto Condensed and
      if Arial Narrow is not on your system, please see https://bit.ly/arialnarrow
clusterProfiler v3.14.3  For help: https://guangchuangyu.github.io/software/clusterProfiler

If you use clusterProfiler in published research, please cite:
Guangchuang Yu, Li-Gen Wang, Yanyan Han, Qing-Yu He. clusterProfiler: an R package for comparing biological themes among gene clusters. OMICS: A Journal of Integrative Biology. 2012, 16(5):284-287.
Registering fonts with R

载入程辑包:‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout

载入需要的程辑包:Biobase
载入需要的程辑包:BiocGenerics
载入需要的程辑包:parallel

载入程辑包:‘BiocGenerics’

The following objects are masked from ‘package:parallel’:

    clusterApply, clusterApplyLB, clusterCall, clusterEvalQ, clusterExport, clusterMap, parApply, parCapply,
    parLapply, parLapplyLB, parRapply, parSapply, parSapplyLB

The following objects are masked from ‘package:dplyr’:

    combine, intersect, setdiff, union

The following objects are masked from ‘package:stats’:

    IQR, mad, sd, var, xtabs

The following objects are masked from ‘package:base’:

    anyDuplicated, append, as.data.frame, basename, cbind, colnames, dirname, do.call, duplicated, eval,
    evalq, Filter, Find, get, grep, grepl, intersect, is.unsorted, lapply, Map, mapply, match, mget, order,
    paste, pmax, pmax.int, pmin, pmin.int, Position, rank, rbind, Reduce, rownames, sapply, setdiff, sort,
    table, tapply, union, unique, unsplit, which, which.max, which.min

Welcome to Bioconductor

    Vignettes contain introductory material; view with 'browseVignettes()'. To cite Bioconductor, see
    'citation("Biobase")', and for packages 'citation("pkgname")'.

载入需要的程辑包:e1071

载入程辑包:‘widgetTools’

The following object is masked from ‘package:dplyr’:

    funs


载入程辑包:‘DynDoc’

The following object is masked from ‘package:BiocGenerics’:

    path


载入程辑包:‘DT’

The following object is masked from ‘package:Seurat’:

    JS

========================================
circlize version 0.4.13
CRAN page: https://cran.r-project.org/package=circlize
Github page: https://github.com/jokergoo/circlize
Documentation: https://jokergoo.github.io/circlize_book/book/

If you use it in published research, please cite:
Gu, Z. circlize implements and enhances circular visualization
  in R. Bioinformatics 2014.

This message can be suppressed by:
  suppressPackageStartupMessages(library(circlize))
========================================

载入需要的程辑包:grid
========================================
ComplexHeatmap version 2.2.0
Bioconductor page: http://bioconductor.org/packages/ComplexHeatmap/
Github page: https://github.com/jokergoo/ComplexHeatmap
Documentation: http://jokergoo.github.io/ComplexHeatmap-reference

If you use it in published research, please cite:
Gu, Z. Complex heatmaps reveal patterns and correlations in multidimensional 
  genomic data. Bioinformatics 2016.
========================================


载入程辑包:‘ComplexHeatmap’

The following object is masked from ‘package:plotly’:

    add_heatmap
library(org.Hs.eg.db)
载入需要的程辑包:AnnotationDbi
载入需要的程辑包:stats4
载入需要的程辑包:IRanges
载入需要的程辑包:S4Vectors

载入程辑包:‘S4Vectors’

The following object is masked from ‘package:plotly’:

    rename

The following object is masked from ‘package:tidyr’:

    expand

The following objects are masked from ‘package:dplyr’:

    first, rename

The following object is masked from ‘package:base’:

    expand.grid


载入程辑包:‘IRanges’

The following object is masked from ‘package:plotly’:

    slice

The following objects are masked from ‘package:dplyr’:

    collapse, desc, slice


载入程辑包:‘AnnotationDbi’

The following object is masked from ‘package:plotly’:

    select

The following object is masked from ‘package:dplyr’:

    select
library(msigdbr)
library(GSVA)
library(fgsea)
载入需要的程辑包:Rcpp
library(UCell)

分离AC和PA的SMC亚群

```r
select.cells <- CellSelector(plot = DimPlot(ds2, reduction = \umap\)) #去除边角的离群细胞
ds2 <- subset(ds2, cell = select.cells)
# saveRDS(ds2,\ds2.rds\)
umapplot(ds2,split.by = \conditions\)
ds2 <- ds2 %>% FindNeighbors(dims = 1:20) %>% FindClusters(resolution = 0.15)
umapplot(ds2, group.by = \seurat_clusters\,split.by = \conditions\)
Idents(ds2) <- ds2$conditions
ds2_AC <- subset(ds2, idents = \AC\)
ds2_PA <- subset(ds2, idents = \PA\)
ds2_AC <- ds2_AC %>% FindNeighbors(dims = 1:20) %>% FindClusters(resolution = 0.1)
ds2_PA <- ds2_PA %>% FindNeighbors(dims = 1:20) %>% FindClusters(resolution = 0.1)

umapplot(ds2_AC) + scale_y_continuous(limits = c(-5,15),breaks = NULL) +
        scale_x_continuous(limits = c(-5,15),breaks = NULL)
umapplot(ds2_PA)+ scale_y_continuous(limits = c(-5,15),breaks = NULL) +
        scale_x_continuous(limits = c(-5,15),breaks = NULL)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

## find markers

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZHMyX21hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMoZHMyLCBsb2dmYy50aHJlc2hvbGQgPSAwLjUsIG1pbi5kaWZmLnBjdCA9IDAuMiwgb25seS5wb3MgPSBGKVxuYGBgIn0= -->

```r
ds2_markers <- FindAllMarkers(ds2, logfc.threshold = 0.5, min.diff.pct = 0.2, only.pos = F)
Calculating cluster SMC1
Calculating cluster Fibromyocyte
Calculating cluster Pericyte
Calculating cluster Fibroblast
Calculating cluster SMC2
ds2_markers_pos <- ds2_markers[ds2_markers$avg_logFC>0, ]
ds2_markers_neg <- ds2_markers[ds2_markers$avg_logFC<0, ]

GO and KEGG

GSVA

exprmat <- get_data_table(ds2, highvar = T,type = "data")
clusterinfo <- ds2@meta.data[,c("orig.ident","Classification1")]
mbd <- msigdbr(species = "Homo sapiens", category = "C7") # C7 免疫
msigdbr_list <- split(x = mbd$gene_symbol, f = mbd$gs_name)

immo_res <- gsva(exprmat, msigdbr_list, kcdf="Gaussian",method = "gsva", parallel.sz = 6) #gsva 在server上运行
pheatmap(immo_res, show_rownames=1, show_colnames=0, 
         annotation_col=clusterinfo,fontsize_row=5, wiidth=8, height=6)#绘制热图
es <- data.frame(t(immo_res),stringsAsFactors=F)  #添加到单细胞矩阵中,可视化相关通路的在umap上聚集情况,可理解为一个通路即一个基因
dataset1 <- AddclusterinfoData(pbmc, es)
FeaturePlot(dataset1, features = "KEGG_PRIMARY_BILE_ACID_BIOSYNTHESIS", reduction = 'umap')

#GSEA

addmodulescore

geneset <- read.table("fibromyo")
dataset1 <- AddModuleScore(dataset1,features = geneset, name = 'fibromyo_score')
f("fibromyo_score1", dataset1, min.cutoff = 0)
dataset1 <- AddModuleScore_UCell(dataset1,features = geneset, name = 'fibromyo_score')
f("V1fibromyo_score", dataset1)

ds2

SMC2

umapplot(ds2)

ds2_markers <- FindMarkers(ds2,ident.1 = "SMC2",min.diff.pct = 0.2, logfc.threshold = 0.5)

  |                                                  | 0 % ~calculating  
  |+                                                 | 2 % ~00s          
  |++                                                | 4 % ~00s          
  |+++                                               | 6 % ~00s          
  |++++                                              | 8 % ~00s          
  |+++++                                             | 10% ~00s          
  |++++++                                            | 12% ~00s          
  |+++++++                                           | 14% ~00s          
  |++++++++                                          | 16% ~00s          
  |+++++++++                                         | 18% ~00s          
  |++++++++++                                        | 20% ~00s          
  |+++++++++++                                       | 22% ~00s          
  |++++++++++++                                      | 24% ~00s          
  |+++++++++++++                                     | 26% ~00s          
  |++++++++++++++                                    | 28% ~00s          
  |+++++++++++++++                                   | 30% ~00s          
  |++++++++++++++++                                  | 32% ~00s          
  |+++++++++++++++++                                 | 34% ~00s          
  |++++++++++++++++++                                | 36% ~00s          
  |+++++++++++++++++++                               | 38% ~00s          
  |++++++++++++++++++++                              | 40% ~00s          
  |+++++++++++++++++++++                             | 42% ~00s          
  |++++++++++++++++++++++                            | 44% ~00s          
  |+++++++++++++++++++++++                           | 46% ~00s          
  |++++++++++++++++++++++++                          | 48% ~00s          
  |+++++++++++++++++++++++++                         | 50% ~00s          
  |++++++++++++++++++++++++++                        | 52% ~00s          
  |+++++++++++++++++++++++++++                       | 54% ~00s          
  |++++++++++++++++++++++++++++                      | 56% ~00s          
  |+++++++++++++++++++++++++++++                     | 58% ~00s          
  |++++++++++++++++++++++++++++++                    | 60% ~00s          
  |+++++++++++++++++++++++++++++++                   | 62% ~00s          
  |++++++++++++++++++++++++++++++++                  | 64% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~00s          
  |++++++++++++++++++++++++++++++++++                | 68% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  
ds2_markers_pos <- ds2_markers[ds2_markers$avg_logFC>0, ]
ds2_markers_neg <- ds2_markers[ds2_markers$avg_logFC<0, ]
library(org.Hs.eg.db)
gene_list <- rownames(ds2_markers_pos)
up_enrich.go <- enrichGO(
    gene = gene_list, # 基因列表文件中的基因名称
    OrgDb = org.Hs.eg.db, keyType = "SYMBOL",
    ont = "BP", # 可选 BP、MF、CC,也可以指定 ALL 同时计算 3 者
    pAdjustMethod = "fdr", pvalueCutoff = 0.05, qvalueCutoff = 0.2)

ggobj <- dotplot(up_enrich.go, showCategory = 10) + theme_classic() +
  theme(text = element_text(colour = "black", size = 16), 
          plot.title = element_text(size = 16,color="black",hjust = 0.5),
          axis.title = element_text(size = 16,color ="black"),
          axis.text = element_text(size= 16,color = "black"))
ggsave("ds2SMC2_up_enrich.svg",device = svg, plot = ggobj, width = 10, height = 6)

ggsave("ds2SMC2_up_enrich2.svg",device = svg, plot = cnetplot(up_enrich.go, showCategory = 8, colorEdge = T), width = 10, height = 6)

emapplot(up_enrich.go, showCategory = 10)

##down-regulated genes
gene_list <- rownames(ds2_markers_neg)
down_enrich.go <- enrichGO(
    gene = gene_list, # 基因列表文件中的基因名称
    OrgDb = org.Hs.eg.db, keyType = "SYMBOL",
    ont = "BP", # 可选 BP、MF、CC,也可以指定 ALL 同时计算 3 者
    pAdjustMethod = "fdr", pvalueCutoff = 0.05, qvalueCutoff = 0.2)
ggobj <- dotplot(down_enrich.go, showCategory = 10) + theme_classic() +
  theme(text = element_text(colour = "black", size = 16), 
          plot.title = element_text(size = 16,color="black",hjust = 0.5),
          axis.title = element_text(size = 16,color ="black"),
          axis.text = element_text(size= 16,color = "black"))

ggsave("ds2SMC2_down_enrich.svg",device = svg, plot = ggobj, width = 10, height = 6)

ggsave("ds2SMC2_down_enrich2.svg",device = svg, plot = cnetplot(down_enrich.go,  showCategory = 8, colorEdge = T), width = 10, height = 6)
emapplot(down_enrich.go, showCategory = 10)

SMC1

umapplot(ds2)
ds2_markers <- FindMarkers(ds2,ident.1 = "SMC1",min.diff.pct = 0.2, logfc.threshold = 0.5)

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01s          
  |++                                                | 3 % ~01s          
  |+++                                               | 4 % ~01s          
  |+++                                               | 6 % ~01s          
  |++++                                              | 7 % ~01s          
  |+++++                                             | 9 % ~01s          
  |++++++                                            | 10% ~01s          
  |++++++                                            | 12% ~01s          
  |+++++++                                           | 13% ~01s          
  |++++++++                                          | 15% ~01s          
  |+++++++++                                         | 16% ~00s          
  |+++++++++                                         | 18% ~00s          
  |++++++++++                                        | 19% ~00s          
  |+++++++++++                                       | 21% ~00s          
  |++++++++++++                                      | 22% ~00s          
  |++++++++++++                                      | 24% ~00s          
  |+++++++++++++                                     | 25% ~00s          
  |++++++++++++++                                    | 26% ~00s          
  |++++++++++++++                                    | 28% ~00s          
  |+++++++++++++++                                   | 29% ~00s          
  |++++++++++++++++                                  | 31% ~00s          
  |+++++++++++++++++                                 | 32% ~00s          
  |+++++++++++++++++                                 | 34% ~00s          
  |++++++++++++++++++                                | 35% ~00s          
  |+++++++++++++++++++                               | 37% ~00s          
  |++++++++++++++++++++                              | 38% ~00s          
  |++++++++++++++++++++                              | 40% ~00s          
  |+++++++++++++++++++++                             | 41% ~00s          
  |++++++++++++++++++++++                            | 43% ~00s          
  |+++++++++++++++++++++++                           | 44% ~00s          
  |+++++++++++++++++++++++                           | 46% ~00s          
  |++++++++++++++++++++++++                          | 47% ~00s          
  |+++++++++++++++++++++++++                         | 49% ~00s          
  |+++++++++++++++++++++++++                         | 50% ~00s          
  |++++++++++++++++++++++++++                        | 51% ~00s          
  |+++++++++++++++++++++++++++                       | 53% ~00s          
  |++++++++++++++++++++++++++++                      | 54% ~00s          
  |++++++++++++++++++++++++++++                      | 56% ~00s          
  |+++++++++++++++++++++++++++++                     | 57% ~00s          
  |++++++++++++++++++++++++++++++                    | 59% ~00s          
  |+++++++++++++++++++++++++++++++                   | 60% ~00s          
  |+++++++++++++++++++++++++++++++                   | 62% ~00s          
  |++++++++++++++++++++++++++++++++                  | 63% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~00s          
  |++++++++++++++++++++++++++++++++++                | 66% ~00s          
  |++++++++++++++++++++++++++++++++++                | 68% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01s  
ds2_markers_pos <- ds2_markers[ds2_markers$avg_logFC>0, ]
ds2_markers_neg <- ds2_markers[ds2_markers$avg_logFC<0, ]

gene_list <- rownames(ds2_markers_pos)
up_enrich.go <- enrichGO(
    gene = gene_list, # 基因列表文件中的基因名称
    OrgDb = org.Hs.eg.db, keyType = "SYMBOL",
    ont = "BP", # 可选 BP、MF、CC,也可以指定 ALL 同时计算 3 者
    pAdjustMethod = "fdr", pvalueCutoff = 0.05, qvalueCutoff = 0.2)

ggobj <- dotplot(up_enrich.go, showCategory = 10) + theme_classic() +
  theme(text = element_text(colour = "black", size = 16), 
          plot.title = element_text(size = 16,color="black",hjust = 0.5),
          axis.title = element_text(size = 16,color ="black"),
          axis.text = element_text(size= 16,color = "black"))
ggsave("ds2SMC1_up_enrich.svg",device = svg, plot = ggobj, width = 10, height = 6)

ggsave("ds2SMC1_up_enrich2.svg",device = svg, plot = cnetplot(up_enrich.go, showCategory = 8, colorEdge = T), width = 10, height = 6)

emapplot(up_enrich.go, showCategory = 10)


##down-regulated genes
gene_list <- rownames(ds2_markers_neg)
down_enrich.go <- enrichGO(
    gene = gene_list, # 基因列表文件中的基因名称
    OrgDb = org.Hs.eg.db, keyType = "SYMBOL",
    ont = "BP", # 可选 BP、MF、CC,也可以指定 ALL 同时计算 3 者
    pAdjustMethod = "fdr", pvalueCutoff = 0.05, qvalueCutoff = 0.2)
ggobj <- dotplot(down_enrich.go, showCategory = 10) + theme_classic() +
  theme(text = element_text(colour = "black", size = 16), 
          plot.title = element_text(size = 16,color="black",hjust = 0.5),
          axis.title = element_text(size = 16,color ="black"),
          axis.text = element_text(size= 16,color = "black"))

ggsave("ds2SMC1_down_enrich.svg",device = svg, plot = ggobj, width = 10, height = 6)

ggsave("ds2SMC1_down_enrich2.svg",device = svg, plot = cnetplot(down_enrich.go,  showCategory = 8, colorEdge = T), width = 10, height = 6)
emapplot(down_enrich.go, showCategory = 10)

fibromyocyte

umapplot(ds2)

ds2_markers <- FindMarkers(ds2,ident.1 = "Fibromyocyte",min.diff.pct = 0.2, logfc.threshold = 0.5)

  |                                                  | 0 % ~calculating  
  |+                                                 | 2 % ~00s          
  |++                                                | 4 % ~00s          
  |+++                                               | 6 % ~00s          
  |++++                                              | 8 % ~00s          
  |+++++                                             | 10% ~00s          
  |++++++                                            | 12% ~00s          
  |+++++++                                           | 13% ~00s          
  |++++++++                                          | 15% ~00s          
  |+++++++++                                         | 17% ~00s          
  |++++++++++                                        | 19% ~00s          
  |+++++++++++                                       | 21% ~00s          
  |++++++++++++                                      | 23% ~00s          
  |+++++++++++++                                     | 25% ~00s          
  |++++++++++++++                                    | 27% ~00s          
  |+++++++++++++++                                   | 29% ~00s          
  |++++++++++++++++                                  | 31% ~00s          
  |+++++++++++++++++                                 | 33% ~00s          
  |++++++++++++++++++                                | 35% ~00s          
  |+++++++++++++++++++                               | 37% ~00s          
  |++++++++++++++++++++                              | 38% ~00s          
  |+++++++++++++++++++++                             | 40% ~00s          
  |++++++++++++++++++++++                            | 42% ~00s          
  |+++++++++++++++++++++++                           | 44% ~00s          
  |++++++++++++++++++++++++                          | 46% ~00s          
  |+++++++++++++++++++++++++                         | 48% ~00s          
  |+++++++++++++++++++++++++                         | 50% ~00s          
  |++++++++++++++++++++++++++                        | 52% ~00s          
  |+++++++++++++++++++++++++++                       | 54% ~00s          
  |++++++++++++++++++++++++++++                      | 56% ~00s          
  |+++++++++++++++++++++++++++++                     | 58% ~00s          
  |++++++++++++++++++++++++++++++                    | 60% ~00s          
  |+++++++++++++++++++++++++++++++                   | 62% ~00s          
  |++++++++++++++++++++++++++++++++                  | 63% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  
ds2_markers_pos <- ds2_markers[ds2_markers$avg_logFC>0, ]
ds2_markers_neg <- ds2_markers[ds2_markers$avg_logFC<0, ]
gene_list <- rownames(ds2_markers_pos)
up_enrich.go <- enrichGO(
    gene = gene_list, # 基因列表文件中的基因名称
    OrgDb = org.Hs.eg.db, keyType = "SYMBOL",
    ont = "BP", # 可选 BP、MF、CC,也可以指定 ALL 同时计算 3 者
    pAdjustMethod = "fdr", pvalueCutoff = 0.05, qvalueCutoff = 0.2)

ggobj <- dotplot(up_enrich.go, showCategory = 10) + theme_classic() +
  theme(text = element_text(colour = "black", size = 16), 
          plot.title = element_text(size = 16,color="black",hjust = 0.5),
          axis.title = element_text(size = 16,color ="black"),
          axis.text = element_text(size= 16,color = "black"))
ggsave("ds2Fibromyocyte_up_enrich.svg",device = svg, plot = ggobj, width = 10, height = 6)

ggsave("ds2Fibromyocyte_up_enrich2.svg",device = svg, plot = cnetplot(up_enrich.go, showCategory = 8, colorEdge = T), width = 10, height = 6)

emapplot(up_enrich.go, showCategory = 10)


##down-regulated genes
gene_list <- rownames(ds2_markers_neg)
down_enrich.go <- enrichGO(
    gene = gene_list, # 基因列表文件中的基因名称
    OrgDb = org.Hs.eg.db, keyType = "SYMBOL",
    ont = "BP", # 可选 BP、MF、CC,也可以指定 ALL 同时计算 3 者
    pAdjustMethod = "fdr", pvalueCutoff = 0.05, qvalueCutoff = 0.2)
ggobj <- dotplot(down_enrich.go, showCategory = 10) + theme_classic() +
  theme(text = element_text(colour = "black", size = 16), 
          plot.title = element_text(size = 16,color="black",hjust = 0.5),
          axis.title = element_text(size = 16,color ="black"),
          axis.text = element_text(size= 16,color = "black"))

ggsave("ds2Fibromyocyte_down_enrich.svg",device = svg, plot = ggobj, width = 10, height = 6)

ggsave("ds2Fibromyocyte_down_enrich2.svg",device = svg, plot = cnetplot(down_enrich.go,  showCategory = 8, colorEdge = T), width = 10, height = 6)
emapplot(down_enrich.go, showCategory = 10)

Pericyte

umapplot(ds2)
ds2_markers <- FindMarkers(ds2,ident.1 = "Pericyte",min.diff.pct = 0.2, logfc.threshold = 0.5)
ds2_markers_pos <- ds2_markers[ds2_markers$avg_logFC>0, ]
ds2_markers_neg <- ds2_markers[ds2_markers$avg_logFC<0, ]

gene_list <- rownames(ds2_markers_pos)
up_enrich.go <- enrichGO(
    gene = gene_list, # 基因列表文件中的基因名称
    OrgDb = org.Hs.eg.db, keyType = "SYMBOL",
    ont = "BP", # 可选 BP、MF、CC,也可以指定 ALL 同时计算 3 者
    pAdjustMethod = "fdr", pvalueCutoff = 0.05, qvalueCutoff = 0.2)

ggobj <- dotplot(up_enrich.go, showCategory = 10) + theme_classic() +
  theme(text = element_text(colour = "black", size = 16), 
          plot.title = element_text(size = 16,color="black",hjust = 0.5),
          axis.title = element_text(size = 16,color ="black"),
          axis.text = element_text(size= 16,color = "black"))
ggsave("ds2Pericyte_up_enrich.svg",device = svg, plot = ggobj, width = 14, height = 6)
ggsave("ds2Pericyte_up_enrich2.svg",device = svg, plot = cnetplot(up_enrich.go, showCategory = 8, colorEdge = T), width = 10, height = 6)


##down-regulated genes
gene_list <- rownames(ds2_markers_neg)
down_enrich.go <- enrichGO(
    gene = gene_list, # 基因列表文件中的基因名称
    OrgDb = org.Hs.eg.db, keyType = "SYMBOL",
    ont = "BP", # 可选 BP、MF、CC,也可以指定 ALL 同时计算 3 者
    pAdjustMethod = "fdr", pvalueCutoff = 0.05, qvalueCutoff = 0.2)
ggobj <- dotplot(down_enrich.go, showCategory = 10) + theme_classic() +
  theme(text = element_text(colour = "black", size = 16), 
          plot.title = element_text(size = 16,color="black",hjust = 0.5),
          axis.title = element_text(size = 16,color ="black"),
          axis.text = element_text(size= 16,color = "black"))

ggsave("ds2Pericyte_down_enrich.svg",device = svg, plot = ggobj, width = 14, height = 6)
ggsave("ds2Pericyte_down_enrich2.svg",device = svg, plot = cnetplot(down_enrich.go,  showCategory = 8, colorEdge = T), width = 10, height = 6)

ds1

SMC2

umapplot(ds1)

ds1_markers <- FindMarkers(ds1,ident.1 = "SMC2",min.diff.pct = 0.2, logfc.threshold = 0.5)

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~00s          
  |++                                                | 3 % ~00s          
  |++                                                | 4 % ~00s          
  |+++                                               | 5 % ~00s          
  |++++                                              | 7 % ~00s          
  |++++                                              | 8 % ~00s          
  |+++++                                             | 9 % ~00s          
  |++++++                                            | 11% ~00s          
  |++++++                                            | 12% ~00s          
  |+++++++                                           | 13% ~00s          
  |++++++++                                          | 15% ~00s          
  |++++++++                                          | 16% ~00s          
  |+++++++++                                         | 17% ~00s          
  |++++++++++                                        | 19% ~00s          
  |++++++++++                                        | 20% ~00s          
  |+++++++++++                                       | 21% ~00s          
  |++++++++++++                                      | 23% ~00s          
  |++++++++++++                                      | 24% ~00s          
  |+++++++++++++                                     | 25% ~00s          
  |++++++++++++++                                    | 27% ~00s          
  |++++++++++++++                                    | 28% ~00s          
  |+++++++++++++++                                   | 29% ~00s          
  |++++++++++++++++                                  | 31% ~00s          
  |++++++++++++++++                                  | 32% ~00s          
  |+++++++++++++++++                                 | 33% ~00s          
  |++++++++++++++++++                                | 35% ~00s          
  |++++++++++++++++++                                | 36% ~00s          
  |+++++++++++++++++++                               | 37% ~00s          
  |++++++++++++++++++++                              | 39% ~00s          
  |++++++++++++++++++++                              | 40% ~00s          
  |+++++++++++++++++++++                             | 41% ~00s          
  |++++++++++++++++++++++                            | 43% ~00s          
  |++++++++++++++++++++++                            | 44% ~00s          
  |+++++++++++++++++++++++                           | 45% ~00s          
  |++++++++++++++++++++++++                          | 47% ~00s          
  |++++++++++++++++++++++++                          | 48% ~00s          
  |+++++++++++++++++++++++++                         | 49% ~00s          
  |++++++++++++++++++++++++++                        | 51% ~00s          
  |++++++++++++++++++++++++++                        | 52% ~00s          
  |+++++++++++++++++++++++++++                       | 53% ~00s          
  |++++++++++++++++++++++++++++                      | 55% ~00s          
  |++++++++++++++++++++++++++++                      | 56% ~00s          
  |+++++++++++++++++++++++++++++                     | 57% ~00s          
  |++++++++++++++++++++++++++++++                    | 59% ~00s          
  |++++++++++++++++++++++++++++++                    | 60% ~00s          
  |+++++++++++++++++++++++++++++++                   | 61% ~00s          
  |++++++++++++++++++++++++++++++++                  | 63% ~00s          
  |++++++++++++++++++++++++++++++++                  | 64% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |++++++++++++++++++++++++++++++++++                | 68% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  
ds1_markers_pos <- ds1_markers[ds1_markers$avg_logFC>0, ]
ds1_markers_neg <- ds1_markers[ds1_markers$avg_logFC<0, ]
gene_list <- rownames(ds1_markers_pos)
up_enrich.go <- enrichGO(
    gene = gene_list, # 基因列表文件中的基因名称
    OrgDb = org.Hs.eg.db, keyType = "SYMBOL",
    ont = "BP", # 可选 BP、MF、CC,也可以指定 ALL 同时计算 3 者
    pAdjustMethod = "fdr", pvalueCutoff = 0.05, qvalueCutoff = 0.2)

ggobj <- dotplot(up_enrich.go, showCategory = 10) + theme_classic() +
  theme(text = element_text(colour = "black", size = 16), 
          plot.title = element_text(size = 16,color="black",hjust = 0.5),
          axis.title = element_text(size = 16,color ="black"),
          axis.text = element_text(size= 16,color = "black"))
ggsave("ds1SMC2_up_enrich.svg",device = svg, plot = ggobj, width = 14, height = 6)

ggsave("ds1SMC2_up_enrich2.svg",device = svg, plot = cnetplot(up_enrich.go, showCategory = 8, colorEdge = T), width = 10, height = 6)

emapplot(up_enrich.go, showCategory = 10)

##down-regulated genes
gene_list <- rownames(ds1_markers_neg)
down_enrich.go <- enrichGO(
    gene = gene_list, # 基因列表文件中的基因名称
    OrgDb = org.Hs.eg.db, keyType = "SYMBOL",
    ont = "BP", # 可选 BP、MF、CC,也可以指定 ALL 同时计算 3 者
    pAdjustMethod = "fdr", pvalueCutoff = 0.05, qvalueCutoff = 0.2)

SMC1

umapplot(ds1)
ds1_markers <- FindMarkers(ds1,ident.1 = "SMC1",min.diff.pct = 0.2, logfc.threshold = 0.5)
ds1_markers_pos <- ds1_markers[ds1_markers$avg_logFC>0, ]
ds1_markers_neg <- ds1_markers[ds1_markers$avg_logFC<0, ]

gene_list <- rownames(ds1_markers_pos)
up_enrich.go <- enrichGO(
    gene = gene_list, # 基因列表文件中的基因名称
    OrgDb = org.Hs.eg.db, keyType = "SYMBOL",
    ont = "BP", # 可选 BP、MF、CC,也可以指定 ALL 同时计算 3 者
    pAdjustMethod = "fdr", pvalueCutoff = 0.05, qvalueCutoff = 0.2)

ggobj <- dotplot(up_enrich.go, showCategory = 10) + theme_classic() +
  theme(text = element_text(colour = "black", size = 16), 
          plot.title = element_text(size = 16,color="black",hjust = 0.5),
          axis.title = element_text(size = 16,color ="black"),
          axis.text = element_text(size= 16,color = "black"))
ggsave("ds1SMC1_up_enrich.svg",device = svg, plot = ggobj, width = 10, height = 6)
ggsave("ds1SMC1_up_enrich2.svg",device = svg, plot = cnetplot(up_enrich.go, showCategory = 8, colorEdge = T), width = 10, height = 6)


##down-regulated genes
gene_list <- rownames(ds1_markers_neg)
down_enrich.go <- enrichGO(
    gene = gene_list, # 基因列表文件中的基因名称
    OrgDb = org.Hs.eg.db, keyType = "SYMBOL",
    ont = "BP", # 可选 BP、MF、CC,也可以指定 ALL 同时计算 3 者
    pAdjustMethod = "fdr", pvalueCutoff = 0.05, qvalueCutoff = 0.2)
ggobj <- dotplot(down_enrich.go, showCategory = 10) + theme_classic() +
  theme(text = element_text(colour = "black", size = 16), 
          plot.title = element_text(size = 16,color="black",hjust = 0.5),
          axis.title = element_text(size = 16,color ="black"),
          axis.text = element_text(size= 16,color = "black"))

ggsave("ds1SMC1_down_enrich.svg",device = svg, plot = ggobj, width = 10, height = 6)
ggsave("ds1SMC1_down_enrich2.svg",device = svg, plot = cnetplot(down_enrich.go,  showCategory = 8, colorEdge = T), width = 10, height = 6)

fibromyocyte

umapplot(ds1)
ds1_markers <- FindMarkers(ds1,ident.1 = "Fibromyocyte",min.diff.pct = 0.2, logfc.threshold = 0.5)
ds1_markers_pos <- ds1_markers[ds1_markers$avg_logFC>0, ]
ds1_markers_neg <- ds1_markers[ds1_markers$avg_logFC<0, ]
gene_list <- rownames(ds1_markers_pos)
up_enrich.go <- enrichGO(
    gene = gene_list, # 基因列表文件中的基因名称
    OrgDb = org.Hs.eg.db, keyType = "SYMBOL",
    ont = "BP", # 可选 BP、MF、CC,也可以指定 ALL 同时计算 3 者
    pAdjustMethod = "fdr", pvalueCutoff = 0.05, qvalueCutoff = 0.2)

ggobj <- dotplot(up_enrich.go, showCategory = 10) + theme_classic() +
  theme(text = element_text(colour = "black", size = 16), 
          plot.title = element_text(size = 16,color="black",hjust = 0.5),
          axis.title = element_text(size = 16,color ="black"),
          axis.text = element_text(size= 16,color = "black"))
ggsave("ds1Fibromyocyte_up_enrich.svg",device = svg, plot = ggobj, width = 10, height = 6)

ggsave("ds1Fibromyocyte_up_enrich2.svg",device = svg, plot = cnetplot(up_enrich.go, showCategory = 8, colorEdge = T), width = 10, height = 6)

emapplot(up_enrich.go, showCategory = 10)

##down-regulated genes
gene_list <- rownames(ds1_markers_neg)
down_enrich.go <- enrichGO(
    gene = gene_list, # 基因列表文件中的基因名称
    OrgDb = org.Hs.eg.db, keyType = "SYMBOL",
    ont = "BP", # 可选 BP、MF、CC,也可以指定 ALL 同时计算 3 者
    pAdjustMethod = "fdr", pvalueCutoff = 0.05, qvalueCutoff = 0.2)
ggobj <- dotplot(down_enrich.go, showCategory = 10) + theme_classic() +
  theme(text = element_text(colour = "black", size = 16), 
          plot.title = element_text(size = 16,color="black",hjust = 0.5),
          axis.title = element_text(size = 16,color ="black"),
          axis.text = element_text(size= 16,color = "black"))

ggsave("ds1Fibromyocyte_down_enrich.svg",device = svg, plot = ggobj, width = 10, height = 6)

ggsave("ds1Fibromyocyte_down_enrich2.svg",device = svg, plot = cnetplot(down_enrich.go,  showCategory = 8, colorEdge = T), width = 10, height = 6)
emapplot(down_enrich.go, showCategory = 10)

雷达图 fig4

svg("GO_res.svg",height = 8,width = 10)
radarchart(data, axistype=0, seg = 5,
 pcol=colors_border, pfcol=colors_in, plwd=1.3 , plty=1,pty=32,
 cglcol="black", cglty=3, cglwd=0.6,
)
legend(x=-1.6, y=0.5, legend = rownames(data[-c(1,2),]), bty = "n", pch=20 , col=colors_border, text.col = "black", cex=1, pt.cex=2)
dev.off()
null device 
          1 

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ3RybCtTaGlmdCtFbnRlciouIAoKIyBBQ+WSjFBB55qEU01D6L+b5LiA5q2l5YiG5p6QCmBgYHtyfQpzb3VyY2UoInRpYW5mZW5nUndyYXBwZXJzLlIiKQpsaWJyYXJ5KG9yZy5Icy5lZy5kYikKbGlicmFyeShtc2lnZGJyKQpsaWJyYXJ5KEdTVkEpCmxpYnJhcnkoZmdzZWEpCmxpYnJhcnkoVUNlbGwpCmRzMiA8LSByZWFkUkRTKCJkczIucmRzIikKZHMwIDwtIHJlYWRSRFMoImRzMC5yZHMiKQpkczEgPC0gcmVhZFJEUygiZHMxLnJkcyIpCmBgYAoKIyMg5YiG56a7QUPlkoxQQeeahFNNQ+S6mue+pApgYGB7cn0Kc2VsZWN0LmNlbGxzIDwtIENlbGxTZWxlY3RvcihwbG90ID0gRGltUGxvdChkczIsIHJlZHVjdGlvbiA9ICJ1bWFwIikpICPljrvpmaTovrnop5LnmoTnprvnvqTnu4bog54KZHMyIDwtIHN1YnNldChkczIsIGNlbGwgPSBzZWxlY3QuY2VsbHMpCiMgc2F2ZVJEUyhkczIsImRzMi5yZHMiKQp1bWFwcGxvdChkczIsc3BsaXQuYnkgPSAiY29uZGl0aW9ucyIpCmRzMiA8LSBkczIgJT4lIEZpbmROZWlnaGJvcnMoZGltcyA9IDE6MjApICU+JSBGaW5kQ2x1c3RlcnMocmVzb2x1dGlvbiA9IDAuMTUpCnVtYXBwbG90KGRzMiwgZ3JvdXAuYnkgPSAic2V1cmF0X2NsdXN0ZXJzIixzcGxpdC5ieSA9ICJjb25kaXRpb25zIikKSWRlbnRzKGRzMikgPC0gZHMyJGNvbmRpdGlvbnMKZHMyX0FDIDwtIHN1YnNldChkczIsIGlkZW50cyA9ICJBQyIpCmRzMl9QQSA8LSBzdWJzZXQoZHMyLCBpZGVudHMgPSAiUEEiKQpkczJfQUMgPC0gZHMyX0FDICU+JSBGaW5kTmVpZ2hib3JzKGRpbXMgPSAxOjIwKSAlPiUgRmluZENsdXN0ZXJzKHJlc29sdXRpb24gPSAwLjEpCmRzMl9QQSA8LSBkczJfUEEgJT4lIEZpbmROZWlnaGJvcnMoZGltcyA9IDE6MjApICU+JSBGaW5kQ2x1c3RlcnMocmVzb2x1dGlvbiA9IDAuMSkKCnVtYXBwbG90KGRzMl9BQykgKyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtNSwxNSksYnJlYWtzID0gTlVMTCkgKwogICAgICAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC01LDE1KSxicmVha3MgPSBOVUxMKQp1bWFwcGxvdChkczJfUEEpKyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtNSwxNSksYnJlYWtzID0gTlVMTCkgKwogICAgICAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC01LDE1KSxicmVha3MgPSBOVUxMKQpgYGAKIyMgZmluZCBtYXJrZXJzCmBgYHtyfQpkczJfbWFya2VycyA8LSBGaW5kQWxsTWFya2VycyhkczIsIGxvZ2ZjLnRocmVzaG9sZCA9IDAuNSwgbWluLmRpZmYucGN0ID0gMC4yLCBvbmx5LnBvcyA9IEYpCmRzMl9tYXJrZXJzX3BvcyA8LSBkczJfbWFya2Vyc1tkczJfbWFya2VycyRhdmdfbG9nRkM+MCwgXQpkczJfbWFya2Vyc19uZWcgPC0gZHMyX21hcmtlcnNbZHMyX21hcmtlcnMkYXZnX2xvZ0ZDPDAsIF0KYGBgCgojIyBHTyBhbmQgS0VHRwpgYGB7cixmaWcud2lkdGg9OCxmaWcuaGVpZ2h0PTZ9CiMjdXAtcmVndWxhdGVkIGdlbmVzCmdlbmVfbGlzdCA8LSBkczJfbWFya2Vyc19wb3NbZHMyX21hcmtlcnNfcG9zJGNsdXN0ZXIgPT0gIlNNQzIiLF0kZ2VuZQoKdXBfZW5yaWNoLmdvIDwtIGVucmljaEdPKAogICAgZ2VuZSA9IGdlbmVfbGlzdCwgIyDln7rlm6DliJfooajmlofku7bkuK3nmoTln7rlm6DlkI3np7AKICAgIE9yZ0RiID0gb3JnLkhzLmVnLmRiLCBrZXlUeXBlID0gIlNZTUJPTCIsCiAgICBvbnQgPSAiQUxMIiwgIyDlj6/pgIkgQlDjgIFNRuOAgUND77yM5Lmf5Y+v5Lul5oyH5a6aIEFMTCDlkIzml7borqHnrpcgMyDogIUKICAgIHBBZGp1c3RNZXRob2QgPSAiZmRyIiwgcHZhbHVlQ3V0b2ZmID0gMC4wNSwgcXZhbHVlQ3V0b2ZmID0gMC4yKQoKZG90cGxvdCh1cF9lbnJpY2guZ28sIHNob3dDYXRlZ29yeSA9IDEwKSArIHRoZW1lX2NsYXNzaWMoKQplbnJpY2hwbG90OjpjbmV0cGxvdCh1cF9lbnJpY2guZ28sIHNob3dDYXRlZ29yeSA9IDUsIGNvbG9yRWRnZSA9IFQpCmVtYXBwbG90KHVwX2VucmljaC5nbywgc2hvd0NhdGVnb3J5ID0gMTApCgojI2Rvd24tcmVndWxhdGVkIGdlbmVzCmdlbmVfbGlzdCA8LSBkczJfbWFya2Vyc19uZWdbZHMyX21hcmtlcnNfbmVnJGNsdXN0ZXIgPT0gMixdJGdlbmUKZG93bl9lbnJpY2guZ28gPC0gZW5yaWNoR08oCiAgICBnZW5lID0gZ2VuZV9saXN0LCAjIOWfuuWboOWIl+ihqOaWh+S7tuS4reeahOWfuuWboOWQjeensAogICAgT3JnRGIgPSBvcmcuSHMuZWcuZGIsIGtleVR5cGUgPSAiU1lNQk9MIiwKICAgIG9udCA9ICJBTEwiLCAjIOWPr+mAiSBCUOOAgU1G44CBQ0PvvIzkuZ/lj6/ku6XmjIflrpogQUxMIOWQjOaXtuiuoeeulyAzIOiAhQogICAgcEFkanVzdE1ldGhvZCA9ICJmZHIiLCBwdmFsdWVDdXRvZmYgPSAwLjA1LCBxdmFsdWVDdXRvZmYgPSAwLjIpCgpkb3RwbG90KGRvd25fZW5yaWNoLmdvLCBzaG93Q2F0ZWdvcnkgPSAxMCkKY25ldHBsb3QoZG93bl9lbnJpY2guZ28sIHNob3dDYXRlZ29yeSA9IDEwKQplbWFwcGxvdChkb3duX2VucmljaC5nbywgc2hvd0NhdGVnb3J5ID0gMTApCgpgYGAKCgojIyBHU1ZBCmBgYHtyfQpleHBybWF0IDwtIGdldF9kYXRhX3RhYmxlKGRzMiwgaGlnaHZhciA9IFQsdHlwZSA9ICJkYXRhIikKY2x1c3RlcmluZm8gPC0gZHMyQG1ldGEuZGF0YVssYygib3JpZy5pZGVudCIsIkNsYXNzaWZpY2F0aW9uMSIpXQptYmQgPC0gbXNpZ2RicihzcGVjaWVzID0gIkhvbW8gc2FwaWVucyIsIGNhdGVnb3J5ID0gIkM3IikgIyBDNyDlhY3nlqsKbXNpZ2Ricl9saXN0IDwtIHNwbGl0KHggPSBtYmQkZ2VuZV9zeW1ib2wsIGYgPSBtYmQkZ3NfbmFtZSkKCmltbW9fcmVzIDwtIGdzdmEoZXhwcm1hdCwgbXNpZ2Ricl9saXN0LCBrY2RmPSJHYXVzc2lhbiIsbWV0aG9kID0gImdzdmEiLCBwYXJhbGxlbC5zeiA9IDYpICNnc3ZhIOWcqHNlcnZlcuS4iui/kOihjApwaGVhdG1hcChpbW1vX3Jlcywgc2hvd19yb3duYW1lcz0xLCBzaG93X2NvbG5hbWVzPTAsIAogICAgICAgICBhbm5vdGF0aW9uX2NvbD1jbHVzdGVyaW5mbyxmb250c2l6ZV9yb3c9NSwgd2lpZHRoPTgsIGhlaWdodD02KSPnu5jliLbng63lm74KYGBgCgoKYGBge3J9CmVzIDwtIGRhdGEuZnJhbWUodChpbW1vX3Jlcyksc3RyaW5nc0FzRmFjdG9ycz1GKSAgI+a3u+WKoOWIsOWNlee7huiDnuefqemYteS4re+8jOWPr+inhuWMluebuOWFs+mAmui3r+eahOWcqHVtYXDkuIrogZrpm4bmg4XlhrXvvIzlj6/nkIbop6PkuLrkuIDkuKrpgJrot6/ljbPkuIDkuKrln7rlm6AKZGF0YXNldDEgPC0gQWRkY2x1c3RlcmluZm9EYXRhKHBibWMsIGVzKQpGZWF0dXJlUGxvdChkYXRhc2V0MSwgZmVhdHVyZXMgPSAiS0VHR19QUklNQVJZX0JJTEVfQUNJRF9CSU9TWU5USEVTSVMiLCByZWR1Y3Rpb24gPSAndW1hcCcpCgoKYGBgCgojR1NFQQpgYGB7cn0KbGlicmFyeShjbHVzdGVyUHJvZmlsZXIpCmxpYnJhcnkoZW5yaWNocGxvdCkKbWFya2VycyA8LSBGaW5kTWFya2VycyhkczIsIGlkZW50LjEgPSAiU01DMiIsbWluLnBjdCA9IDAuMSwgbG9nZmMudGhyZXNob2xkID0gMC4xLHRocmVzaC51c2UgPSAwLjkpCkRFR3MgPC0gbWFya2VycyRhdmdfbG9nRkMKbmFtZXMoREVHcykgPSByb3duYW1lcyhtYXJrZXJzKQpERUdzIDwtIHNvcnQoREVHcyxkZWNyZWFzaW5nID0gVCkKaGVhZChERUdzKQoKIyBHT19kYiA8LSBtc2lnZGJyKHNwZWNpZXMgPSAiSG9tbyBzYXBpZW5zIixjYXRlZ29yeSA9ICJDNSIpICU+JQogICMgZHBseXI6OnNlbGVjdChnc19leGFjdF9zb3VyY2UsZ2VuZV9zeW1ib2wpICNDNSBHTyAgQzcg5YWN55arCgptZGJfYzIgPC0gbXNpZ2RicihzcGVjaWVzID0gIkhvbW8gc2FwaWVucyIsIGNhdGVnb3J5ID0gIkMyIikKbWRiX2tlZ2cgPC0gIG1kYl9jMiBbZ3JlcCgiXktFR0ciLCBtZGJfYzIgJGdzX25hbWUpLF0KR09fZGI8LW1kYl9rZWdnICU+JSBkcGx5cjo6c2VsZWN0KGdzX25hbWUsIGdlbmVfc3ltYm9sKQoKR1NFQV9yZXMgPC0gY2x1c3RlclByb2ZpbGVyOjpHU0VBKERFR3MsIFRFUk0yR0VORSA9IEdPX2RiLHB2YWx1ZUN1dG9mZiA9IDAuMSkKCmRvdHBsb3QoR1NFQV9yZXMsc3BsaXQ9Ii5zaWduIikrZmFjZXRfZ3JpZCh+LnNpZ24pICsgdGhlbWVfY2xhc3NpYygpCgplbnJpY2hwbG90Ojpnc2VhcGxvdDIoR1NFQV9yZXMsIGdlbmVTZXRJRCA9IDEsIHRpdGxlID0gR1NFQV9yZXMkRGVzY3JpcHRpb25bMV0pCgojIGZvcihpIGluIHNlcV9hbG9uZyhHU0VBX3Jlc0ByZXN1bHQkSUQpKXsKIyAgIGVucmljaHBsb3Q6OmdzZWFwbG90MihHU0VBX3JlcywgZ2VuZVNldElEID0gaSwgdGl0bGUgPSBHU0VBX3Jlc0ByZXN1bHQkSURbaV0pCiMgfQpyaWRnZXBsb3QoR1NFQV9yZXMpIApnc2VhcGxvdDIoR1NFQV9yZXMsMTo1KQpgYGAKCgojICBhZGRtb2R1bGVzY29yZQpgYGB7cn0KZ2VuZXNldCA8LSByZWFkLnRhYmxlKCJmaWJyb215byIpCmRhdGFzZXQxIDwtIEFkZE1vZHVsZVNjb3JlKGRhdGFzZXQxLGZlYXR1cmVzID0gZ2VuZXNldCwgbmFtZSA9ICdmaWJyb215b19zY29yZScpCmYoImZpYnJvbXlvX3Njb3JlMSIsIGRhdGFzZXQxLCBtaW4uY3V0b2ZmID0gMCkKZGF0YXNldDEgPC0gQWRkTW9kdWxlU2NvcmVfVUNlbGwoZGF0YXNldDEsZmVhdHVyZXMgPSBnZW5lc2V0LCBuYW1lID0gJ2ZpYnJvbXlvX3Njb3JlJykKZigiVjFmaWJyb215b19zY29yZSIsIGRhdGFzZXQxKQpgYGAKCiMgZHMyCiMjIFNNQzIKYGBge3J9CnVtYXBwbG90KGRzMikKZHMyX21hcmtlcnMgPC0gRmluZE1hcmtlcnMoZHMyLGlkZW50LjEgPSAiU01DMiIsbWluLmRpZmYucGN0ID0gMC4yLCBsb2dmYy50aHJlc2hvbGQgPSAwLjUpCmRzMl9tYXJrZXJzX3BvcyA8LSBkczJfbWFya2Vyc1tkczJfbWFya2VycyRhdmdfbG9nRkM+MCwgXQpkczJfbWFya2Vyc19uZWcgPC0gZHMyX21hcmtlcnNbZHMyX21hcmtlcnMkYXZnX2xvZ0ZDPDAsIF0KYGBgCgpgYGB7ciBmaWcud2lkdGg9OCxmaWcuaGVpZ2h0PTR9CmxpYnJhcnkob3JnLkhzLmVnLmRiKQpnZW5lX2xpc3QgPC0gcm93bmFtZXMoZHMyX21hcmtlcnNfcG9zKQp1cF9lbnJpY2guZ28gPC0gZW5yaWNoR08oCiAgICBnZW5lID0gZ2VuZV9saXN0LCAjIOWfuuWboOWIl+ihqOaWh+S7tuS4reeahOWfuuWboOWQjeensAogICAgT3JnRGIgPSBvcmcuSHMuZWcuZGIsIGtleVR5cGUgPSAiU1lNQk9MIiwKICAgIG9udCA9ICJCUCIsICMg5Y+v6YCJIEJQ44CBTUbjgIFDQ++8jOS5n+WPr+S7peaMh+WumiBBTEwg5ZCM5pe26K6h566XIDMg6ICFCiAgICBwQWRqdXN0TWV0aG9kID0gImZkciIsIHB2YWx1ZUN1dG9mZiA9IDAuMDUsIHF2YWx1ZUN1dG9mZiA9IDAuMikKCmdnb2JqIDwtIGRvdHBsb3QodXBfZW5yaWNoLmdvLCBzaG93Q2F0ZWdvcnkgPSAxMCkgKyB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwgCiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNixjb2xvcj0iYmxhY2siLGhqdXN0ID0gMC41KSwKICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LGNvbG9yID0iYmxhY2siKSwKICAgICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPSAxNixjb2xvciA9ICJibGFjayIpKQpnZ3NhdmUoImRzMlNNQzJfdXBfZW5yaWNoLnN2ZyIsZGV2aWNlID0gc3ZnLCBwbG90ID0gZ2dvYmosIHdpZHRoID0gMTAsIGhlaWdodCA9IDYpCgpnZ3NhdmUoImRzMlNNQzJfdXBfZW5yaWNoMi5zdmciLGRldmljZSA9IHN2ZywgcGxvdCA9IGNuZXRwbG90KHVwX2VucmljaC5nbywgc2hvd0NhdGVnb3J5ID0gOCwgY29sb3JFZGdlID0gVCksIHdpZHRoID0gMTAsIGhlaWdodCA9IDYpCgplbWFwcGxvdCh1cF9lbnJpY2guZ28sIHNob3dDYXRlZ29yeSA9IDEwKQoKIyNkb3duLXJlZ3VsYXRlZCBnZW5lcwpnZW5lX2xpc3QgPC0gcm93bmFtZXMoZHMyX21hcmtlcnNfbmVnKQpkb3duX2VucmljaC5nbyA8LSBlbnJpY2hHTygKICAgIGdlbmUgPSBnZW5lX2xpc3QsICMg5Z+65Zug5YiX6KGo5paH5Lu25Lit55qE5Z+65Zug5ZCN56ewCiAgICBPcmdEYiA9IG9yZy5Icy5lZy5kYiwga2V5VHlwZSA9ICJTWU1CT0wiLAogICAgb250ID0gIkJQIiwgIyDlj6/pgIkgQlDjgIFNRuOAgUND77yM5Lmf5Y+v5Lul5oyH5a6aIEFMTCDlkIzml7borqHnrpcgMyDogIUKICAgIHBBZGp1c3RNZXRob2QgPSAiZmRyIiwgcHZhbHVlQ3V0b2ZmID0gMC4wNSwgcXZhbHVlQ3V0b2ZmID0gMC4yKQpnZ29iaiA8LSBkb3RwbG90KGRvd25fZW5yaWNoLmdvLCBzaG93Q2F0ZWdvcnkgPSAxMCkgKyB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwgCiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNixjb2xvcj0iYmxhY2siLGhqdXN0ID0gMC41KSwKICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LGNvbG9yID0iYmxhY2siKSwKICAgICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPSAxNixjb2xvciA9ICJibGFjayIpKQoKZ2dzYXZlKCJkczJTTUMyX2Rvd25fZW5yaWNoLnN2ZyIsZGV2aWNlID0gc3ZnLCBwbG90ID0gZ2dvYmosIHdpZHRoID0gMTAsIGhlaWdodCA9IDYpCgpnZ3NhdmUoImRzMlNNQzJfZG93bl9lbnJpY2gyLnN2ZyIsZGV2aWNlID0gc3ZnLCBwbG90ID0gY25ldHBsb3QoZG93bl9lbnJpY2guZ28sICBzaG93Q2F0ZWdvcnkgPSA4LCBjb2xvckVkZ2UgPSBUKSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNikKZW1hcHBsb3QoZG93bl9lbnJpY2guZ28sIHNob3dDYXRlZ29yeSA9IDEwKQoKYGBgCgoKIyMgU01DMQpgYGB7ciBmaWcud2lkdGg9OCxmaWcuaGVpZ2h0PTR9CnVtYXBwbG90KGRzMikKZHMyX21hcmtlcnMgPC0gRmluZE1hcmtlcnMoZHMyLGlkZW50LjEgPSAiU01DMSIsbWluLmRpZmYucGN0ID0gMC4yLCBsb2dmYy50aHJlc2hvbGQgPSAwLjUpCmRzMl9tYXJrZXJzX3BvcyA8LSBkczJfbWFya2Vyc1tkczJfbWFya2VycyRhdmdfbG9nRkM+MCwgXQpkczJfbWFya2Vyc19uZWcgPC0gZHMyX21hcmtlcnNbZHMyX21hcmtlcnMkYXZnX2xvZ0ZDPDAsIF0KYGBgCgpgYGB7ciBmaWcud2lkdGg9OCxmaWcuaGVpZ2h0PTR9CgpnZW5lX2xpc3QgPC0gcm93bmFtZXMoZHMyX21hcmtlcnNfcG9zKQp1cF9lbnJpY2guZ28gPC0gZW5yaWNoR08oCiAgICBnZW5lID0gZ2VuZV9saXN0LCAjIOWfuuWboOWIl+ihqOaWh+S7tuS4reeahOWfuuWboOWQjeensAogICAgT3JnRGIgPSBvcmcuSHMuZWcuZGIsIGtleVR5cGUgPSAiU1lNQk9MIiwKICAgIG9udCA9ICJCUCIsICMg5Y+v6YCJIEJQ44CBTUbjgIFDQ++8jOS5n+WPr+S7peaMh+WumiBBTEwg5ZCM5pe26K6h566XIDMg6ICFCiAgICBwQWRqdXN0TWV0aG9kID0gImZkciIsIHB2YWx1ZUN1dG9mZiA9IDAuMDUsIHF2YWx1ZUN1dG9mZiA9IDAuMikKCmdnb2JqIDwtIGRvdHBsb3QodXBfZW5yaWNoLmdvLCBzaG93Q2F0ZWdvcnkgPSAxMCkgKyB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwgCiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNixjb2xvcj0iYmxhY2siLGhqdXN0ID0gMC41KSwKICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LGNvbG9yID0iYmxhY2siKSwKICAgICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPSAxNixjb2xvciA9ICJibGFjayIpKQpnZ3NhdmUoImRzMlNNQzFfdXBfZW5yaWNoLnN2ZyIsZGV2aWNlID0gc3ZnLCBwbG90ID0gZ2dvYmosIHdpZHRoID0gMTAsIGhlaWdodCA9IDYpCmdnc2F2ZSgiZHMyU01DMV91cF9lbnJpY2gyLnN2ZyIsZGV2aWNlID0gc3ZnLCBwbG90ID0gY25ldHBsb3QodXBfZW5yaWNoLmdvLCBzaG93Q2F0ZWdvcnkgPSA4LCBjb2xvckVkZ2UgPSBUKSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNikKCgojI2Rvd24tcmVndWxhdGVkIGdlbmVzCmdlbmVfbGlzdCA8LSByb3duYW1lcyhkczJfbWFya2Vyc19uZWcpCmRvd25fZW5yaWNoLmdvIDwtIGVucmljaEdPKAogICAgZ2VuZSA9IGdlbmVfbGlzdCwgIyDln7rlm6DliJfooajmlofku7bkuK3nmoTln7rlm6DlkI3np7AKICAgIE9yZ0RiID0gb3JnLkhzLmVnLmRiLCBrZXlUeXBlID0gIlNZTUJPTCIsCiAgICBvbnQgPSAiQlAiLCAjIOWPr+mAiSBCUOOAgU1G44CBQ0PvvIzkuZ/lj6/ku6XmjIflrpogQUxMIOWQjOaXtuiuoeeulyAzIOiAhQogICAgcEFkanVzdE1ldGhvZCA9ICJmZHIiLCBwdmFsdWVDdXRvZmYgPSAwLjA1LCBxdmFsdWVDdXRvZmYgPSAwLjIpCmdnb2JqIDwtIGRvdHBsb3QoZG93bl9lbnJpY2guZ28sIHNob3dDYXRlZ29yeSA9IDEwKSArIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMTYpLCAKICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LGNvbG9yPSJibGFjayIsaGp1c3QgPSAwLjUpLAogICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsY29sb3IgPSJibGFjayIpLAogICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9IDE2LGNvbG9yID0gImJsYWNrIikpCgpnZ3NhdmUoImRzMlNNQzFfZG93bl9lbnJpY2guc3ZnIixkZXZpY2UgPSBzdmcsIHBsb3QgPSBnZ29iaiwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNikKZ2dzYXZlKCJkczJTTUMxX2Rvd25fZW5yaWNoMi5zdmciLGRldmljZSA9IHN2ZywgcGxvdCA9IGNuZXRwbG90KGRvd25fZW5yaWNoLmdvLCAgc2hvd0NhdGVnb3J5ID0gOCwgY29sb3JFZGdlID0gVCksIHdpZHRoID0gMTAsIGhlaWdodCA9IDYpCgpgYGAKCiMjIGZpYnJvbXlvY3l0ZQpgYGB7ciBmaWcud2lkdGg9OCxmaWcuaGVpZ2h0PTR9CnVtYXBwbG90KGRzMikKZHMyX21hcmtlcnMgPC0gRmluZE1hcmtlcnMoZHMyLGlkZW50LjEgPSAiRmlicm9teW9jeXRlIixtaW4uZGlmZi5wY3QgPSAwLjIsIGxvZ2ZjLnRocmVzaG9sZCA9IDAuNSkKZHMyX21hcmtlcnNfcG9zIDwtIGRzMl9tYXJrZXJzW2RzMl9tYXJrZXJzJGF2Z19sb2dGQz4wLCBdCmRzMl9tYXJrZXJzX25lZyA8LSBkczJfbWFya2Vyc1tkczJfbWFya2VycyRhdmdfbG9nRkM8MCwgXQpgYGAKCmBgYHtyIGZpZy53aWR0aD04LGZpZy5oZWlnaHQ9NH0KZ2VuZV9saXN0IDwtIHJvd25hbWVzKGRzMl9tYXJrZXJzX3BvcykKdXBfZW5yaWNoLmdvIDwtIGVucmljaEdPKAogICAgZ2VuZSA9IGdlbmVfbGlzdCwgIyDln7rlm6DliJfooajmlofku7bkuK3nmoTln7rlm6DlkI3np7AKICAgIE9yZ0RiID0gb3JnLkhzLmVnLmRiLCBrZXlUeXBlID0gIlNZTUJPTCIsCiAgICBvbnQgPSAiQlAiLCAjIOWPr+mAiSBCUOOAgU1G44CBQ0PvvIzkuZ/lj6/ku6XmjIflrpogQUxMIOWQjOaXtuiuoeeulyAzIOiAhQogICAgcEFkanVzdE1ldGhvZCA9ICJmZHIiLCBwdmFsdWVDdXRvZmYgPSAwLjA1LCBxdmFsdWVDdXRvZmYgPSAwLjIpCgpnZ29iaiA8LSBkb3RwbG90KHVwX2VucmljaC5nbywgc2hvd0NhdGVnb3J5ID0gMTApICsgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxNiksIAogICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsY29sb3I9ImJsYWNrIixoanVzdCA9IDAuNSksCiAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNixjb2xvciA9ImJsYWNrIiksCiAgICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0gMTYsY29sb3IgPSAiYmxhY2siKSkKZ2dzYXZlKCJkczJGaWJyb215b2N5dGVfdXBfZW5yaWNoLnN2ZyIsZGV2aWNlID0gc3ZnLCBwbG90ID0gZ2dvYmosIHdpZHRoID0gMTAsIGhlaWdodCA9IDYpCgpnZ3NhdmUoImRzMkZpYnJvbXlvY3l0ZV91cF9lbnJpY2gyLnN2ZyIsZGV2aWNlID0gc3ZnLCBwbG90ID0gY25ldHBsb3QodXBfZW5yaWNoLmdvLCBzaG93Q2F0ZWdvcnkgPSA4LCBjb2xvckVkZ2UgPSBUKSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNikKCmVtYXBwbG90KHVwX2VucmljaC5nbywgc2hvd0NhdGVnb3J5ID0gMTApCgojI2Rvd24tcmVndWxhdGVkIGdlbmVzCmdlbmVfbGlzdCA8LSByb3duYW1lcyhkczJfbWFya2Vyc19uZWcpCmRvd25fZW5yaWNoLmdvIDwtIGVucmljaEdPKAogICAgZ2VuZSA9IGdlbmVfbGlzdCwgIyDln7rlm6DliJfooajmlofku7bkuK3nmoTln7rlm6DlkI3np7AKICAgIE9yZ0RiID0gb3JnLkhzLmVnLmRiLCBrZXlUeXBlID0gIlNZTUJPTCIsCiAgICBvbnQgPSAiQlAiLCAjIOWPr+mAiSBCUOOAgU1G44CBQ0PvvIzkuZ/lj6/ku6XmjIflrpogQUxMIOWQjOaXtuiuoeeulyAzIOiAhQogICAgcEFkanVzdE1ldGhvZCA9ICJmZHIiLCBwdmFsdWVDdXRvZmYgPSAwLjA1LCBxdmFsdWVDdXRvZmYgPSAwLjIpCmdnb2JqIDwtIGRvdHBsb3QoZG93bl9lbnJpY2guZ28sIHNob3dDYXRlZ29yeSA9IDEwKSArIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMTYpLCAKICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LGNvbG9yPSJibGFjayIsaGp1c3QgPSAwLjUpLAogICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsY29sb3IgPSJibGFjayIpLAogICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9IDE2LGNvbG9yID0gImJsYWNrIikpCgpnZ3NhdmUoImRzMkZpYnJvbXlvY3l0ZV9kb3duX2VucmljaC5zdmciLGRldmljZSA9IHN2ZywgcGxvdCA9IGdnb2JqLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA2KQoKZ2dzYXZlKCJkczJGaWJyb215b2N5dGVfZG93bl9lbnJpY2gyLnN2ZyIsZGV2aWNlID0gc3ZnLCBwbG90ID0gY25ldHBsb3QoZG93bl9lbnJpY2guZ28sICBzaG93Q2F0ZWdvcnkgPSA4LCBjb2xvckVkZ2UgPSBUKSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNikKZW1hcHBsb3QoZG93bl9lbnJpY2guZ28sIHNob3dDYXRlZ29yeSA9IDEwKQoKYGBgCgojIyBQZXJpY3l0ZQpgYGB7ciBmaWcud2lkdGg9OCxmaWcuaGVpZ2h0PTR9CnVtYXBwbG90KGRzMikKZHMyX21hcmtlcnMgPC0gRmluZE1hcmtlcnMoZHMyLGlkZW50LjEgPSAiUGVyaWN5dGUiLG1pbi5kaWZmLnBjdCA9IDAuMiwgbG9nZmMudGhyZXNob2xkID0gMC41KQpkczJfbWFya2Vyc19wb3MgPC0gZHMyX21hcmtlcnNbZHMyX21hcmtlcnMkYXZnX2xvZ0ZDPjAsIF0KZHMyX21hcmtlcnNfbmVnIDwtIGRzMl9tYXJrZXJzW2RzMl9tYXJrZXJzJGF2Z19sb2dGQzwwLCBdCmBgYAoKYGBge3IgZmlnLndpZHRoPTgsZmlnLmhlaWdodD00fQoKZ2VuZV9saXN0IDwtIHJvd25hbWVzKGRzMl9tYXJrZXJzX3BvcykKdXBfZW5yaWNoLmdvIDwtIGVucmljaEdPKAogICAgZ2VuZSA9IGdlbmVfbGlzdCwgIyDln7rlm6DliJfooajmlofku7bkuK3nmoTln7rlm6DlkI3np7AKICAgIE9yZ0RiID0gb3JnLkhzLmVnLmRiLCBrZXlUeXBlID0gIlNZTUJPTCIsCiAgICBvbnQgPSAiQlAiLCAjIOWPr+mAiSBCUOOAgU1G44CBQ0PvvIzkuZ/lj6/ku6XmjIflrpogQUxMIOWQjOaXtuiuoeeulyAzIOiAhQogICAgcEFkanVzdE1ldGhvZCA9ICJmZHIiLCBwdmFsdWVDdXRvZmYgPSAwLjA1LCBxdmFsdWVDdXRvZmYgPSAwLjIpCgpnZ29iaiA8LSBkb3RwbG90KHVwX2VucmljaC5nbywgc2hvd0NhdGVnb3J5ID0gMTApICsgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxNiksIAogICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsY29sb3I9ImJsYWNrIixoanVzdCA9IDAuNSksCiAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNixjb2xvciA9ImJsYWNrIiksCiAgICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0gMTYsY29sb3IgPSAiYmxhY2siKSkKZ2dzYXZlKCJkczJQZXJpY3l0ZV91cF9lbnJpY2guc3ZnIixkZXZpY2UgPSBzdmcsIHBsb3QgPSBnZ29iaiwgd2lkdGggPSAxNCwgaGVpZ2h0ID0gNikKZ2dzYXZlKCJkczJQZXJpY3l0ZV91cF9lbnJpY2gyLnN2ZyIsZGV2aWNlID0gc3ZnLCBwbG90ID0gY25ldHBsb3QodXBfZW5yaWNoLmdvLCBzaG93Q2F0ZWdvcnkgPSA4LCBjb2xvckVkZ2UgPSBUKSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNikKCgojI2Rvd24tcmVndWxhdGVkIGdlbmVzCmdlbmVfbGlzdCA8LSByb3duYW1lcyhkczJfbWFya2Vyc19uZWcpCmRvd25fZW5yaWNoLmdvIDwtIGVucmljaEdPKAogICAgZ2VuZSA9IGdlbmVfbGlzdCwgIyDln7rlm6DliJfooajmlofku7bkuK3nmoTln7rlm6DlkI3np7AKICAgIE9yZ0RiID0gb3JnLkhzLmVnLmRiLCBrZXlUeXBlID0gIlNZTUJPTCIsCiAgICBvbnQgPSAiQlAiLCAjIOWPr+mAiSBCUOOAgU1G44CBQ0PvvIzkuZ/lj6/ku6XmjIflrpogQUxMIOWQjOaXtuiuoeeulyAzIOiAhQogICAgcEFkanVzdE1ldGhvZCA9ICJmZHIiLCBwdmFsdWVDdXRvZmYgPSAwLjA1LCBxdmFsdWVDdXRvZmYgPSAwLjIpCmdnb2JqIDwtIGRvdHBsb3QoZG93bl9lbnJpY2guZ28sIHNob3dDYXRlZ29yeSA9IDEwKSArIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMTYpLCAKICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LGNvbG9yPSJibGFjayIsaGp1c3QgPSAwLjUpLAogICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsY29sb3IgPSJibGFjayIpLAogICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9IDE2LGNvbG9yID0gImJsYWNrIikpCgpnZ3NhdmUoImRzMlBlcmljeXRlX2Rvd25fZW5yaWNoLnN2ZyIsZGV2aWNlID0gc3ZnLCBwbG90ID0gZ2dvYmosIHdpZHRoID0gMTQsIGhlaWdodCA9IDYpCmdnc2F2ZSgiZHMyUGVyaWN5dGVfZG93bl9lbnJpY2gyLnN2ZyIsZGV2aWNlID0gc3ZnLCBwbG90ID0gY25ldHBsb3QoZG93bl9lbnJpY2guZ28sICBzaG93Q2F0ZWdvcnkgPSA4LCBjb2xvckVkZ2UgPSBUKSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNikKCmBgYAoKCiMgZHMxCiMjIFNNQzIKYGBge3J9CnVtYXBwbG90KGRzMSkKZHMxX21hcmtlcnMgPC0gRmluZE1hcmtlcnMoZHMxLGlkZW50LjEgPSAiU01DMiIsbWluLmRpZmYucGN0ID0gMC4yLCBsb2dmYy50aHJlc2hvbGQgPSAwLjUpCmRzMV9tYXJrZXJzX3BvcyA8LSBkczFfbWFya2Vyc1tkczFfbWFya2VycyRhdmdfbG9nRkM+MCwgXQpkczFfbWFya2Vyc19uZWcgPC0gZHMxX21hcmtlcnNbZHMxX21hcmtlcnMkYXZnX2xvZ0ZDPDAsIF0KYGBgCgpgYGB7ciBmaWcud2lkdGg9OCxmaWcuaGVpZ2h0PTR9CmdlbmVfbGlzdCA8LSByb3duYW1lcyhkczFfbWFya2Vyc19wb3MpCnVwX2VucmljaC5nbyA8LSBlbnJpY2hHTygKICAgIGdlbmUgPSBnZW5lX2xpc3QsICMg5Z+65Zug5YiX6KGo5paH5Lu25Lit55qE5Z+65Zug5ZCN56ewCiAgICBPcmdEYiA9IG9yZy5Icy5lZy5kYiwga2V5VHlwZSA9ICJTWU1CT0wiLAogICAgb250ID0gIkJQIiwgIyDlj6/pgIkgQlDjgIFNRuOAgUND77yM5Lmf5Y+v5Lul5oyH5a6aIEFMTCDlkIzml7borqHnrpcgMyDogIUKICAgIHBBZGp1c3RNZXRob2QgPSAiZmRyIiwgcHZhbHVlQ3V0b2ZmID0gMC4wNSwgcXZhbHVlQ3V0b2ZmID0gMC4yKQoKZ2dvYmogPC0gZG90cGxvdCh1cF9lbnJpY2guZ28sIHNob3dDYXRlZ29yeSA9IDEwKSArIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMTYpLCAKICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LGNvbG9yPSJibGFjayIsaGp1c3QgPSAwLjUpLAogICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsY29sb3IgPSJibGFjayIpLAogICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9IDE2LGNvbG9yID0gImJsYWNrIikpCmdnc2F2ZSgiZHMxU01DMl91cF9lbnJpY2guc3ZnIixkZXZpY2UgPSBzdmcsIHBsb3QgPSBnZ29iaiwgd2lkdGggPSAxNCwgaGVpZ2h0ID0gNikKCmdnc2F2ZSgiZHMxU01DMl91cF9lbnJpY2gyLnN2ZyIsZGV2aWNlID0gc3ZnLCBwbG90ID0gY25ldHBsb3QodXBfZW5yaWNoLmdvLCBzaG93Q2F0ZWdvcnkgPSA4LCBjb2xvckVkZ2UgPSBUKSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNikKCmVtYXBwbG90KHVwX2VucmljaC5nbywgc2hvd0NhdGVnb3J5ID0gMTApCgojI2Rvd24tcmVndWxhdGVkIGdlbmVzCmdlbmVfbGlzdCA8LSByb3duYW1lcyhkczFfbWFya2Vyc19uZWcpCmRvd25fZW5yaWNoLmdvIDwtIGVucmljaEdPKAogICAgZ2VuZSA9IGdlbmVfbGlzdCwgIyDln7rlm6DliJfooajmlofku7bkuK3nmoTln7rlm6DlkI3np7AKICAgIE9yZ0RiID0gb3JnLkhzLmVnLmRiLCBrZXlUeXBlID0gIlNZTUJPTCIsCiAgICBvbnQgPSAiQlAiLCAjIOWPr+mAiSBCUOOAgU1G44CBQ0PvvIzkuZ/lj6/ku6XmjIflrpogQUxMIOWQjOaXtuiuoeeulyAzIOiAhQogICAgcEFkanVzdE1ldGhvZCA9ICJmZHIiLCBwdmFsdWVDdXRvZmYgPSAwLjA1LCBxdmFsdWVDdXRvZmYgPSAwLjIpCmdnb2JqIDwtIGRvdHBsb3QoZG93bl9lbnJpY2guZ28sIHNob3dDYXRlZ29yeSA9IDEwKSArIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMTYpLCAKICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LGNvbG9yPSJibGFjayIsaGp1c3QgPSAwLjUpLAogICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsY29sb3IgPSJibGFjayIpLAogICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9IDE2LGNvbG9yID0gImJsYWNrIikpCgpnZ3NhdmUoImRzMVNNQzJfZG93bl9lbnJpY2guc3ZnIixkZXZpY2UgPSBzdmcsIHBsb3QgPSBnZ29iaiwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNikKCmdnc2F2ZSgiZHMxU01DMl9kb3duX2VucmljaDIuc3ZnIixkZXZpY2UgPSBzdmcsIHBsb3QgPSBjbmV0cGxvdChkb3duX2VucmljaC5nbywgIHNob3dDYXRlZ29yeSA9IDgsIGNvbG9yRWRnZSA9IFQpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA2KQplbWFwcGxvdChkb3duX2VucmljaC5nbywgc2hvd0NhdGVnb3J5ID0gMTApCgpgYGAKCgojIyBTTUMxCmBgYHtyIGZpZy53aWR0aD04LGZpZy5oZWlnaHQ9NH0KdW1hcHBsb3QoZHMxKQpkczFfbWFya2VycyA8LSBGaW5kTWFya2VycyhkczEsaWRlbnQuMSA9ICJTTUMxIixtaW4uZGlmZi5wY3QgPSAwLjIsIGxvZ2ZjLnRocmVzaG9sZCA9IDAuNSkKZHMxX21hcmtlcnNfcG9zIDwtIGRzMV9tYXJrZXJzW2RzMV9tYXJrZXJzJGF2Z19sb2dGQz4wLCBdCmRzMV9tYXJrZXJzX25lZyA8LSBkczFfbWFya2Vyc1tkczFfbWFya2VycyRhdmdfbG9nRkM8MCwgXQpgYGAKCmBgYHtyIGZpZy53aWR0aD04LGZpZy5oZWlnaHQ9NH0KCmdlbmVfbGlzdCA8LSByb3duYW1lcyhkczFfbWFya2Vyc19wb3MpCnVwX2VucmljaC5nbyA8LSBlbnJpY2hHTygKICAgIGdlbmUgPSBnZW5lX2xpc3QsICMg5Z+65Zug5YiX6KGo5paH5Lu25Lit55qE5Z+65Zug5ZCN56ewCiAgICBPcmdEYiA9IG9yZy5Icy5lZy5kYiwga2V5VHlwZSA9ICJTWU1CT0wiLAogICAgb250ID0gIkJQIiwgIyDlj6/pgIkgQlDjgIFNRuOAgUND77yM5Lmf5Y+v5Lul5oyH5a6aIEFMTCDlkIzml7borqHnrpcgMyDogIUKICAgIHBBZGp1c3RNZXRob2QgPSAiZmRyIiwgcHZhbHVlQ3V0b2ZmID0gMC4wNSwgcXZhbHVlQ3V0b2ZmID0gMC4yKQoKZ2dvYmogPC0gZG90cGxvdCh1cF9lbnJpY2guZ28sIHNob3dDYXRlZ29yeSA9IDEwKSArIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMTYpLCAKICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LGNvbG9yPSJibGFjayIsaGp1c3QgPSAwLjUpLAogICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsY29sb3IgPSJibGFjayIpLAogICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9IDE2LGNvbG9yID0gImJsYWNrIikpCmdnc2F2ZSgiZHMxU01DMV91cF9lbnJpY2guc3ZnIixkZXZpY2UgPSBzdmcsIHBsb3QgPSBnZ29iaiwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNikKZ2dzYXZlKCJkczFTTUMxX3VwX2VucmljaDIuc3ZnIixkZXZpY2UgPSBzdmcsIHBsb3QgPSBjbmV0cGxvdCh1cF9lbnJpY2guZ28sIHNob3dDYXRlZ29yeSA9IDgsIGNvbG9yRWRnZSA9IFQpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA2KQoKCiMjZG93bi1yZWd1bGF0ZWQgZ2VuZXMKZ2VuZV9saXN0IDwtIHJvd25hbWVzKGRzMV9tYXJrZXJzX25lZykKZG93bl9lbnJpY2guZ28gPC0gZW5yaWNoR08oCiAgICBnZW5lID0gZ2VuZV9saXN0LCAjIOWfuuWboOWIl+ihqOaWh+S7tuS4reeahOWfuuWboOWQjeensAogICAgT3JnRGIgPSBvcmcuSHMuZWcuZGIsIGtleVR5cGUgPSAiU1lNQk9MIiwKICAgIG9udCA9ICJCUCIsICMg5Y+v6YCJIEJQ44CBTUbjgIFDQ++8jOS5n+WPr+S7peaMh+WumiBBTEwg5ZCM5pe26K6h566XIDMg6ICFCiAgICBwQWRqdXN0TWV0aG9kID0gImZkciIsIHB2YWx1ZUN1dG9mZiA9IDAuMDUsIHF2YWx1ZUN1dG9mZiA9IDAuMikKZ2dvYmogPC0gZG90cGxvdChkb3duX2VucmljaC5nbywgc2hvd0NhdGVnb3J5ID0gMTApICsgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxNiksIAogICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsY29sb3I9ImJsYWNrIixoanVzdCA9IDAuNSksCiAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNixjb2xvciA9ImJsYWNrIiksCiAgICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0gMTYsY29sb3IgPSAiYmxhY2siKSkKCmdnc2F2ZSgiZHMxU01DMV9kb3duX2VucmljaC5zdmciLGRldmljZSA9IHN2ZywgcGxvdCA9IGdnb2JqLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA2KQpnZ3NhdmUoImRzMVNNQzFfZG93bl9lbnJpY2gyLnN2ZyIsZGV2aWNlID0gc3ZnLCBwbG90ID0gY25ldHBsb3QoZG93bl9lbnJpY2guZ28sICBzaG93Q2F0ZWdvcnkgPSA4LCBjb2xvckVkZ2UgPSBUKSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNikKCmBgYAoKIyMgZmlicm9teW9jeXRlCmBgYHtyIGZpZy53aWR0aD04LGZpZy5oZWlnaHQ9NH0KdW1hcHBsb3QoZHMxKQpkczFfbWFya2VycyA8LSBGaW5kTWFya2VycyhkczEsaWRlbnQuMSA9ICJGaWJyb215b2N5dGUiLG1pbi5kaWZmLnBjdCA9IDAuMiwgbG9nZmMudGhyZXNob2xkID0gMC41KQpkczFfbWFya2Vyc19wb3MgPC0gZHMxX21hcmtlcnNbZHMxX21hcmtlcnMkYXZnX2xvZ0ZDPjAsIF0KZHMxX21hcmtlcnNfbmVnIDwtIGRzMV9tYXJrZXJzW2RzMV9tYXJrZXJzJGF2Z19sb2dGQzwwLCBdCmBgYAoKYGBge3IgZmlnLndpZHRoPTgsZmlnLmhlaWdodD00fQpnZW5lX2xpc3QgPC0gcm93bmFtZXMoZHMxX21hcmtlcnNfcG9zKQp1cF9lbnJpY2guZ28gPC0gZW5yaWNoR08oCiAgICBnZW5lID0gZ2VuZV9saXN0LCAjIOWfuuWboOWIl+ihqOaWh+S7tuS4reeahOWfuuWboOWQjeensAogICAgT3JnRGIgPSBvcmcuSHMuZWcuZGIsIGtleVR5cGUgPSAiU1lNQk9MIiwKICAgIG9udCA9ICJCUCIsICMg5Y+v6YCJIEJQ44CBTUbjgIFDQ++8jOS5n+WPr+S7peaMh+WumiBBTEwg5ZCM5pe26K6h566XIDMg6ICFCiAgICBwQWRqdXN0TWV0aG9kID0gImZkciIsIHB2YWx1ZUN1dG9mZiA9IDAuMDUsIHF2YWx1ZUN1dG9mZiA9IDAuMikKCmdnb2JqIDwtIGRvdHBsb3QodXBfZW5yaWNoLmdvLCBzaG93Q2F0ZWdvcnkgPSAxMCkgKyB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwgCiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNixjb2xvcj0iYmxhY2siLGhqdXN0ID0gMC41KSwKICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LGNvbG9yID0iYmxhY2siKSwKICAgICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPSAxNixjb2xvciA9ICJibGFjayIpKQpnZ3NhdmUoImRzMUZpYnJvbXlvY3l0ZV91cF9lbnJpY2guc3ZnIixkZXZpY2UgPSBzdmcsIHBsb3QgPSBnZ29iaiwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNikKCmdnc2F2ZSgiZHMxRmlicm9teW9jeXRlX3VwX2VucmljaDIuc3ZnIixkZXZpY2UgPSBzdmcsIHBsb3QgPSBjbmV0cGxvdCh1cF9lbnJpY2guZ28sIHNob3dDYXRlZ29yeSA9IDgsIGNvbG9yRWRnZSA9IFQpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA2KQoKZW1hcHBsb3QodXBfZW5yaWNoLmdvLCBzaG93Q2F0ZWdvcnkgPSAxMCkKCiMjZG93bi1yZWd1bGF0ZWQgZ2VuZXMKZ2VuZV9saXN0IDwtIHJvd25hbWVzKGRzMV9tYXJrZXJzX25lZykKZG93bl9lbnJpY2guZ28gPC0gZW5yaWNoR08oCiAgICBnZW5lID0gZ2VuZV9saXN0LCAjIOWfuuWboOWIl+ihqOaWh+S7tuS4reeahOWfuuWboOWQjeensAogICAgT3JnRGIgPSBvcmcuSHMuZWcuZGIsIGtleVR5cGUgPSAiU1lNQk9MIiwKICAgIG9udCA9ICJCUCIsICMg5Y+v6YCJIEJQ44CBTUbjgIFDQ++8jOS5n+WPr+S7peaMh+WumiBBTEwg5ZCM5pe26K6h566XIDMg6ICFCiAgICBwQWRqdXN0TWV0aG9kID0gImZkciIsIHB2YWx1ZUN1dG9mZiA9IDAuMDUsIHF2YWx1ZUN1dG9mZiA9IDAuMikKZ2dvYmogPC0gZG90cGxvdChkb3duX2VucmljaC5nbywgc2hvd0NhdGVnb3J5ID0gMTApICsgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxNiksIAogICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsY29sb3I9ImJsYWNrIixoanVzdCA9IDAuNSksCiAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNixjb2xvciA9ImJsYWNrIiksCiAgICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0gMTYsY29sb3IgPSAiYmxhY2siKSkKCmdnc2F2ZSgiZHMxRmlicm9teW9jeXRlX2Rvd25fZW5yaWNoLnN2ZyIsZGV2aWNlID0gc3ZnLCBwbG90ID0gZ2dvYmosIHdpZHRoID0gMTAsIGhlaWdodCA9IDYpCgpnZ3NhdmUoImRzMUZpYnJvbXlvY3l0ZV9kb3duX2VucmljaDIuc3ZnIixkZXZpY2UgPSBzdmcsIHBsb3QgPSBjbmV0cGxvdChkb3duX2VucmljaC5nbywgIHNob3dDYXRlZ29yeSA9IDgsIGNvbG9yRWRnZSA9IFQpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA2KQplbWFwcGxvdChkb3duX2VucmljaC5nbywgc2hvd0NhdGVnb3J5ID0gMTApCgpgYGAKCiMg6Zu36L6+5Zu+IGZpZzQKYGBge3J9CmxpYnJhcnkoZm1zYikKZGF0YSA8LSByZWFkLmNzdigiLi9nb19yZXMuY3N2Iixyb3cubmFtZXMgPSAxLHF1b3RlID0gIiIsIGNoZWNrLm5hbWVzPUZBTFNFKQojIGRhdGE9YXMuZGF0YS5mcmFtZShtYXRyaXgoc2FtcGxlKDA6NTAsIDE4LHJlcGxhY2U9VCkgLCBuY29sPTYpKQojIGNvbG5hbWVzKGRhdGEpPWMoJ0lMLTEgc2lnbmFsaW5nIHBhdGh3YXknLCdSZXNwb25zZSB0byBJRk5hJywnTkZrQiBzaWduYWxpbmcgcGF0aHdheScsJ0lMLTYgc2lnbmFsaW5nIHBhdGh3YXknLCAnTXVzY2xlIGNvbnRyYWN0aW9uJywnUmVzcG9uc2UgdG8gSUZOcicpCiMgcm93bmFtZXMoZGF0YSkgPC0gYygnTW9ub2N5dGUnLCdOZXV0cm9waGlsJywnTWFjcm9waGFnZScpCiMg55So5LqO55Sf5oiQ6Zu36L6+5Zu+55qE5pyA5aSn5pyA5bCP5YC8CmRhdGE9cmJpbmQocmVwKDE1LDUpICwgcmVwKC0xMCw1KSAsIGRhdGEpCgoKY29sb3JzX2JvcmRlciA8LSBjb2xvcnNfbGlzdFtjKDQsMSw1KV0KY29sb3JzX2luIDwtIGFlcm9fY29sb3JzX2xpc3RbYyg0LDEsNSldCgpzdmcoIkdPX3Jlcy5zdmciLGhlaWdodCA9IDgsd2lkdGggPSAxMCkKcmFkYXJjaGFydChkYXRhLCBheGlzdHlwZT0wLCBzZWcgPSA1LAogcGNvbD1jb2xvcnNfYm9yZGVyLCBwZmNvbD1jb2xvcnNfaW4sIHBsd2Q9MS4zICwgcGx0eT0xLHB0eT0zMiwKIGNnbGNvbD0iYmxhY2siLCBjZ2x0eT0zLCBjZ2x3ZD0wLjYsCikKbGVnZW5kKHg9LTEuNiwgeT0wLjUsIGxlZ2VuZCA9IHJvd25hbWVzKGRhdGFbLWMoMSwyKSxdKSwgYnR5ID0gIm4iLCBwY2g9MjAgLCBjb2w9Y29sb3JzX2JvcmRlciwgdGV4dC5jb2wgPSAiYmxhY2siLCBjZXg9MSwgcHQuY2V4PTIpCmRldi5vZmYoKQpgYGAKCgpBZGQgYSBuZXcgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpJbnNlcnQgQ2h1bmsqIGJ1dHRvbiBvbiB0aGUgdG9vbGJhciBvciBieSBwcmVzc2luZyAqQ3RybCtBbHQrSSouCgpXaGVuIHlvdSBzYXZlIHRoZSBub3RlYm9vaywgYW4gSFRNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvZGUgYW5kIG91dHB1dCB3aWxsIGJlIHNhdmVkIGFsb25nc2lkZSBpdCAoY2xpY2sgdGhlICpQcmV2aWV3KiBidXR0b24gb3IgcHJlc3MgKkN0cmwrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4KClRoZSBwcmV2aWV3IHNob3dzIHlvdSBhIHJlbmRlcmVkIEhUTUwgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvci4gQ29uc2VxdWVudGx5LCB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZC4K